Differential Equations
Adapted from Woflram.com documentation
Automatically selecting between hundreds of powerful and in many cases original algorithms, the Wolfram Language provides both numerical and symbolic solving of differential equations (ODEs, PDEs, DAEs, DDEs, ...). With equations conveniently specified symbolically, the Wolfram Language uses both its rich set of special functions and its unique symbolic interpolating functions to represent solutions in forms that can immediately be manipulated or visualized
Download original notebookTake derivatives
Take a derivative symbolically of any function
Sin'[x]
Cos[x]
This is an equvivalent to
D[Sin[x], x]
Cos[x]
Define your own function in a separate symbol
f[x_] := Sin[x] + (*SpB[*)Power[x(*|*),(*|*)2](*]SpB*) f'[x] f'[0.5]
2 x+Cos[x]
1.8775825618903728`
DSolve
Solve a differential equation with dependent variable y[x]
:
DSolve[y'[x] + y[x] == a Sin[x], y[x], x]
{{y[x]->((*SpB[*)Power[E(*|*),(*|*)-x](*]SpB*)) (*SbB[*)Subscript[C(*|*),(*|*)1](*]SbB*)+((*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)) a (-Cos[x]+Sin[x])}}
Include a boundary condition:
DSolve[{y'[x] + y[x] == a Sin[x], y[0] == 0}, y[x], x]
{{y[x]->-(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*) a ((*SpB[*)Power[E(*|*),(*|*)-x](*]SpB*)) (-1+((*SpB[*)Power[E(*|*),(*|*)x](*]SpB*)) Cos[x]-((*SpB[*)Power[E(*|*),(*|*)x](*]SpB*)) Sin[x])}}
Specify only the first argument of DSolve:
{{y[x]->((*SpB[*)Power[E(*|*),(*|*)x](*]SpB*)) (*SbB[*)Subscript[C(*|*),(*|*)1](*]SbB*)}}
ODE
Solve Riccati equaiton
DSolve[{y'[x] == y[x] (1 - y[x]/27), y[0] == a}, y, x] // Quiet
{{y->Function[{x},(*FB[*)((27 a ((*SpB[*)Power[E(*|*),(*|*)x](*]SpB*)))(*,*)/(*,*)(27-a+a ((*SpB[*)Power[E(*|*),(*|*)x](*]SpB*))))(*]FB*)]}}
Plot the solution for different initial values:
Plot[Evaluate[y[x] /. % /. {{a->(*FB[*)((1)(*,*)/(*,*)(13))(*]FB*)},{a->(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)},{a->4}}], {x, 0, 18}]
(*VB[*)(FrontEndRef["4cefbc52-2c0e-4587-8f4d-245e34232e5c"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmySnpiUlmxrpGiUbpOqamFqY61qkmaToGpmYphqbGBkbpZomAwCLthWk"*)(*]VB*)
Solve a linear pendulum equation:
sol = DSolve[{y''[x] + y[x] + (*FB[*)((1)(*,*)/(*,*)(5))(*]FB*) y'[x] == 0, y[0] == 1, y'[0] == 1/3}, y , x]
{{y->Function[{x},((*FB[*)((1)(*,*)/(*,*)(99))(*]FB*)) ((*SpB[*)Power[E(*|*),(*|*)-x/10](*]SpB*)) (99 Cos[((*FB[*)((3)(*,*)/(*,*)(10))(*]FB*)) ((*SqB[*)Sqrt[11](*]SqB*)) x]+13 ((*SqB[*)Sqrt[11](*]SqB*)) Sin[((*FB[*)((3)(*,*)/(*,*)(10))(*]FB*)) ((*SqB[*)Sqrt[11](*]SqB*)) x])]}}
Plot[y[x] /. sol, {x, 0, 27}]
(*VB[*)(FrontEndRef["81c57fed-b6c9-4349-9c76-830e52d5e92d"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWxgmm5qnpaboJpklW+qaGJtY6lomm5vpWhgbpJoapZimWhqlAACFNxWP"*)(*]VB*)
Animate it
{x, y[If[x < t, x, t]]} /. First[sol]; AnimateParametricPlot[%, {x, 0, 40}, {t,0, 40}, PlotRange->{{0,40}, {-1,1}}]
(*VB[*)(FrontEndRef["76dcec58-904e-4952-9d94-7bb0b20a968b"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5ulJKcmm1roWhqYpOqaWJoa6VqmWJromiclGSQZGSRamlkkAQCDvxWF"*)(*]VB*)
Model a block on a moving conveyor belt anchored to a wall by a spring. Compare positions and velocities for the different values of the parameters of the system (mass of the block, belt speed, friction coefficient, spring constant):
ClearAll[m]; beltv[t_] = vb; spring[x_] = k (l - x); friction[v_] := -a (v - beltv[t]);
Newton's equation for the block:
sys := { m x''[t] == spring[x[t]] + friction[x'[t]], x[0] == l, x'[0] == 0 };
Solve for position and velocity:
sol = DSolve[sys, x, t]; {pos[m_, k_, a_, vb_, t_], vel[m_, k_, a_, vb_, t_]} = {x[t], x'[t]} /. sol[[1]] // FullSimplify;
The block stabilizes just above the spring's natural length of l:
l = 1; Manipulate[{Plot[{pos[m, k, a, vb, t]}, {t, 0, 2}, PlotRange -> All, PlotLabel -> "Position"], Plot[{vel[m, k, a, vb, t], vb}, {t, 0, 2}, PlotRange -> All, PlotLabel -> "Velocity"]} // Row, {{m, 4, "mass of the block"}, 4, 10, 4}, {{k, 250, "spring constant"}, 250, 1000, 250}, {{vb, 5, "belt velocity"}, 5, 10, 5}, {{a, 15, "friction coefficient"}, 5, 35, 15}]
(*GB[*){{(*VB[*)(EventObject[<|"Id" -> "7172d3a7-25ab-4438-ac8f-1cdbea0c19c1", "Initial" -> {4, 250, 5, 15}, "View" -> "abe8f632-7809-45ec-bbe3-b1d047b75f45"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyalWqSZGRvpmlsYWOqamKYm6yYlpRrrJhmmGJiYJ5mbppmYAgCLnhXY"*)(*]VB*)}(*||*),(*||*){(*VB[*)(FrontEndRef["61febc24-f2fb-4ebc-94e2-7421f388c458"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxmmpSYlG5nophmlJemaANm6liapRrrmJkaGacYWFskmphYAkjcV3Q=="*)(*]VB*)}}(*]GB*)
Hybrid Differential Equations
Model a damped oscillator that gets a kick at regular time intervals:
system = {x''[t] + .1 x'[t] + x[t] == 0, x[0] == 1, x'[0] == 0}; control = WhenEvent[Mod[t, 1] == 0, x'[t] -> x'[t] + 1];
sol = DSolve[{system, control}, x, {t, 0, 50}]; Plot[Evaluate[{x[t], x'[t]} /. sol], {t, 0, 50}, PlotLegends->LineLegend[Automatic, {"Posiiton", "Velocity"}]]
(*VB[*)(Legended[ToExpression[FrontEndRef["545f6ca9-eab4-45e6-8832-cedc643764b2"], InputForm], Placed[LineLegend[{Directive[Opacity[1.], RGBColor[0.24, 0.6, 0.8], AbsoluteThickness[2]], Directive[Opacity[1.], RGBColor[0.95, 0.627, 0.1425], AbsoluteThickness[2]]}, {"Posiiton", "Velocity"}, LegendMarkers -> None, LabelStyle -> {}, LegendLayout -> "Column"], After, Identity]])(*,*)(*"1:eJylUUtOwzAQDX+oQAIOgITENps2DWVRRYUWhJTS0lTdO8kYrAa7sh0gB+AQsGXHCbrmACzYcADYICQEN8B2+ChsWDCLJ3v8Zub5zXrIenjKsiyxpGBA4KwJEeNIMh7MqYwPR0DjMp7UlJKCVkzUmybiCZ1bVbDLGZUtGrfOIUolChMINlS66lSxG6EtG1Do2E4VXLtWq5TtCOLIdSqbrhN+Np5W0EtV2bw+AIo7NMlMts9TyPXNKugmSBXjmS8xPqGQK/zp4xMh84oFBU3CIZLkFHK1+kudEYqIzLhl4s3LyWby3vYOSxjn47WLl8PxnccrJh49fnWp49nL26woaISCJamE/jGJhhSEIFrCfydjE68ev3m/b4fLTx6vlx6uR/XbvycXHDBOdpkgalvUXAaQMD296LhZe25hG/EhcGGeDhiFX0TjNwohCWSWALYKfhepi989fZSxVAZ6d+p/6QkVencNLNUgLWo/BiqVqA+5lqbU"*)(*]VB*)
In a square box, model a ball that changes direction upon impact with the side walls:
ClearAll[a,b,x] sol = DSolve[{x'[t] == a[t], y'[t] == b[t], x[0] == 0, y[0] == 0, a[0] == 1, b[0] == 17/12, WhenEvent[x[t]^2 == 1, a[t] -> -a[t]], WhenEvent[y[t]^2 == 1, b[t] -> -b[t]]}, {x, y}, {t, 0, 50}, DiscreteVariables -> {a, b}];
ParametricPlot[{x[t], y[t]} /. sol, {t, 0, 50}, Frame -> True, FrameTicks -> None, Axes -> False]
(*VB[*)(FrontEndRef["c14b8965-b616-4a8d-8d2e-49751f590327"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJxuaJFlYmpnqJpkZmumaJFqk6FqkGKXqmliamxqmmVoaGBuZAwB86BT2"*)(*]VB*)
NDSolve
Solve a first-order ordinary differential equation:
s = NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30}]
{{y->(*VB[*)BoxForm`temporalStorage$506528(*,*)(*"1:eJxdkUeP2lAAhEmTovyKZE9gIrnwMBBpD/biXhbjgp3VHmz8MO7tGZc/lb8YyDGX0cxoTvP9CMrj5dNsNmu/3YULY1Q2Tgx788+H2UwqEGyqMvNRXER8V5xRXBZvc8xh37DF9zn2E1vMsSfyF5THzLZJtScYo3FwEJks4Ky+ygUtrXLidAvsnA04wwzNKV2OLSurYXvFfbxAReJfgRIlew8PdGpF3qiDrvAnedLY2JOAJDYh8JNkuFDcb1naBFsgH6O68qYq6Nw49CJ3LbhNh5gGRCeBXE/Wfm+ZqNK2+SijQDeQc4WcRjLMq74VJWCJkp0M9aHv6trSBKkflJYGsfpyaDmqD/oBJcsQV9Vd23QTtSdWS37TEebgiJY1ruvBFQc2vam8Agnu4lfniKdlpxfvBy1fqlwJPQXQ2WpEkU03pZbGsaSCcBeRau2CmPcAtfUAz7S7rMOrVNy4+52n5lNMn3H7YhjDlkhSQldP15osszy8jQdDuPXJrsSzUuFdnU4ydF2u8IgRSMiu++fnpweDd4fFFu+Xjw+On+9y7DJofn0Y6IevRTb+a62mg/9tHtBNmMEz8oMMtl/ukfezFv4FhyamkA=="*)(*]VB*)}}
Plot it
Plot[Evaluate[y[x] /. s], {x, 0, 30}, PlotRange -> All]
(*VB[*)(FrontEndRef["3e8dfc8b-e98f-4890-97be-2e71c65f4da6"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG6dapKQlWyTpplpapOmaWFga6FqaJ6XqGqWaGyabmaaZpCSaAQCQvBYk"*)(*]VB*)
Second-order nonlinear ordinary differential equation:
s = NDSolve[{y''[x] + Sin[y[x]] y[x] == 0, y[0] == 1, y'[0] == 0}, y, {x, 0, 30}]
{{y->(*VB[*)BoxForm`temporalStorage$507286(*,*)(*"1:eJxdkUuTmkAAhM2rKpVfkezJha1SZPGRmzzkISA4MKJbe0AYcXgM6DCy+pfyJ6M55vJVd1efun/t6/XhS6/Xoz/u0FLc1meIUQf+fOr1TNKic1OXcYtJtmAkaXFN3voclN+455997oV77nNPwm9kXcswFOwPde5H+0E3HxqdSY6AOukyQMPNxa5GCm8pDYy8oGGW7DYFSC1hNptOaGzjONS2RuOItlherkbVgokm6bVItUTPh/7FKtbpzZpsrltKvSArKpQT2BA2c/19qA+Wp8mt7pZje3Fsk0QbXl2IpchbzPDwxurNuGN4tZ3qYbIWKkPNzCgKfOuYJyXUVcef57gyT2NDdqnmjEiaqGdpd2jLlOc7JBmvERPXtuukwIA395R5imEyEuyQYwaxBbAWq1GXpRlBikT0II63fCQqrWnByN/ly9VcTKBajHahJxlLku8/chwqtgAmfAUOgTk4y0AYu/wg9V5NxJ8UZ+TvYscFVJuKjJd5WWDmoY2mdN6hBSqUnHojfuobCayt4umx/zuUuef3w+fHh1/vWLMSge8PgeJ0RcrrvzQ4M/Rf53E4QCVK2nhfIvrtbhdxSdFfwbujog=="*)(*]VB*)}}
Plot[Evaluate[{y[x], y'[x], y''[x]} /. s], {x, 0, 30}, PlotStyle -> Automatic, PlotLegends->Automatic]
(*VB[*)(Legended[ToExpression[FrontEndRef["0c3f6839-d6e3-4d6b-85c3-8d4d29103162"], InputForm], Placed[LineLegend[{Directive[Opacity[1.], RGBColor[0.24, 0.6, 0.8], AbsoluteThickness[2]], Directive[Opacity[1.], RGBColor[0.95, 0.627, 0.1425], AbsoluteThickness[2]], Directive[Opacity[1.], RGBColor[0.455, 0.7, 0.21], AbsoluteThickness[2]]}, {HoldForm[Placeholder[Style[1, Smaller]]], HoldForm[Placeholder[Style[2, Smaller]]], HoldForm[Placeholder[Style[3, Smaller]]]}, LegendMarkers -> None, LabelStyle -> {}, LegendLayout -> "Column"], After, Identity]])(*,*)(*"1:eJy1Uz1PG0EQPYOTAAlSiFIbIdFaAg4sU6ATxOZDssPHofR7t3OwYr2L5vYA0/MjoKWjoKampKCgoaKwEkVCSAj+AfuBLZkKkTDF093buTdvduZGIrmW9Hqelw5q+MVgtwKxRKIkhp80U4MNEHQi6TEpAxqqlOkzk5jkDPdNwzxKoaqCVvcgzhSJOISjmh6L/aRU9qeLtAR+cZKWomJ5KvaLZTpJJ6bHx/zx0rNwXsNapj/rMw9A6LLgTcuuYwbO30cNK5zEQJMPbTM1JsA5dDl5y6XKvfVrqDCEWLEdcG5NS8vbJGaqiZ6Nh8Al28oLcz8kl4hnhYO71bPLAH0bvwM8OjRxGziZIQ2zUSp5pmB9k8VbAtKUmVb+tXJi4z7Ak8erevT1T4AzA9fH2zPn71552LRcuAmeLfwNsLX//XShdfHKyp27z7WlFyWn8xIbjvncnt+mpgHd4M0kQ9XkwDpWwwbhXJ+/Tabn/8j0vpTpWlP7r7i9qxPcAkzt0U8p4EWiXVISAbeyidd1Ud2pXzqaNdKUmQrNwuvRZA1hjc0mShcynSxREEpP8wn5XfGE"*)(*]VB*)
The Lorenz equations
s = NDSolve[{Derivative[1][x][t] == -3 (x[t] - y[t]), Derivative[1][y][t] == -x[t] z[t] + 26.5 x[t] - y[t], Derivative[1][z][t] == x[t] y[t] - z[t], x[0] == z[0] == 0, y[0] == 1}, {x, y, z}, {t, 0, 200}];
Plot it
ParametricPlot3D[Evaluate[{x[t], y[t], z[t]} /. s], {t, 0, 200}, PlotPoints -> 1000]
(*VB[*)(FrontEndRef["91e247d8-8b60-4a10-8126-fa5c053d2056"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWxqmGpmYp1joWiSZGeiaJBoa6FoYGpnppiWaJhuYGqcYGZiaAQB3JhTa"*)(*]VB*)
Simple wave evolution with periodic boundary conditions:
ClearAll[u] s = NDSolve[{ D[u[t,x], t,t] == D[u[t,x], x,x], u[0, x] == Exp[-(*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)], Derivative[1,0][u][0,x] == 0, u[t, -10] == u[t, 10] }, u, {t, 0, 40}, {x, -10, 10}]
{{u->(*VB[*)BoxForm`temporalStorage$520073(*,*)(*"1:eJxdksmymlAARM1UlcpXJG/lI6lCEFCzA2WeFPCivHoLkMssF7jgwK/l56JZZtPV3dW70z8i5CSfJpMJ/vYQMc571IEcXt0/HyYTte5h16Aq7PM6lYb61OeofpsSQHgjXr9PiV/E65R4oX5D7V7t95Rx2/C7DpBM6gqM6F0bWrYrmppHnZcc4lI6tYbX0n45Vns9MsRzO5AkzGMJbNczlfGUcZ57o1KUFwewFxtxRZGmsFGyTjY03GUXAURUlUn2OgeZmcEbjNqdSKIWcwa2Wc1AEG9NRbDMBvIc697iowU6XcLYQKlNeu0g8vb2JzjgwuHXEXVbcxvRzAqFAfcrrFaRYGEZ7+OG1hakn7T0YrZKVxaZwYUm+znPhElNnZvrUt33AVJPNG9FwCgtQOmMEBwbMtWDZeXzZ/kW8JzFdrulS8YzBW5oVuwRclrUzYV+FI5roNyZ8XDRQ/1W5va1MBLDIwNn1WUwbcfDklqQ6lLOXIcXW6T6mnDofMlcsO2QgiSr6eLup2pozrltSevskPB8sFOj08uTxzsQiNf35OOT6eeHOEMF3a9PA8PYrqv7v9brBvjf5nkAF1bw1IdRBfGXR5TCCsO/oHyqMA=="*)(*]VB*)}}
Plot the solution:
DensityPlot[Evaluate[First[u[t, x] /. s]], {t, 0, 40}, {x, -10, 10}, PlotPoints -> 30]
(*VB[*)(FrontEndRef["6e18cb89-fe5b-4cd2-b1ff-0c6df326f2fe"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm6UaWiQnWVjqpqWaJumaJKcY6SYZpqXpGiSbpaQZG5mlGaWlAgCT/Rac"*)(*]VB*)